package actividades;

import java.io.File;
import java.io.IOException;
import java.util.StringTokenizer;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.json.JSONException;
import org.json.JSONObject;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

import tratamientoDatos.CreacionRutaGPX;
import tratamientoDatos.ParseoArchivoRuta;
import world.trainer.R;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import comunicacionServidor.FuncionesJSON;

public class CargarActivity extends Activity {

	private ListView listaRutas;
	private String stringRutas, stringKm, stringTipo, nombreSeleccionado,
			nombreJson, tipoJson, ficheroJson;
	private float distanciaJson;
	@SuppressWarnings("unused")
	private int idJson;
	private ProgressDialog dialog;
	private String datos[];
	private boolean correcto;
	private static String KEY_SUCCESS = "success";

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.cargar_activity);
		stringRutas = stringKm = stringTipo = "";
		listaRutas = (ListView) findViewById(R.id.listViewListaRutasBici);
		dialog = ProgressDialog.show(this, "", "Cargando...", true);
		dialog.show();
		correcto = true;

		AsyncTask<Void, Void, Void> tarea1 = new ClaseComunicacion1();
		tarea1.execute();

		Button cancelarCargar = (Button) findViewById(R.id.botonCancelarCargarRutaBici);

		cancelarCargar.setOnClickListener(new OnClickListener() {

			public void onClick(View arg0) {
				finish();
				Intent intent = new Intent(getApplicationContext(),
						MainActivity.class);
				Bundle bundle = new Bundle();
				bundle.putString("ACTIVITY", "cargarCancelado");
				intent.putExtras(bundle);
				intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
				startActivity(intent);
			}
		});
	}

	public class ClaseComunicacion1 extends AsyncTask<Void, Void, Void> {
		FuncionesJSON funcion = new FuncionesJSON();
		JSONObject json = new JSONObject();

		@Override
		protected Void doInBackground(Void... params) {
			correcto = true;
			try {

				json = funcion.misRutas();

			} catch (Exception e) {
				e.printStackTrace();
				correcto = false;
			}
			return null;
		}

		@Override
		protected void onPostExecute(Void result) {
			dialog.dismiss();
			if (correcto) {
				try {
					if (json.getString(KEY_SUCCESS) != null) {
						String res = json.getString(KEY_SUCCESS);
						if (Integer.parseInt(res) == 1) {

							stringTipo = json.getString("misTipos");
							stringKm = json.getString("misKm");
							stringRutas = json.getString("misRutas");

							StringTokenizer stRutas = new StringTokenizer(
									stringRutas, " ");
							StringTokenizer stKm = new StringTokenizer(
									stringKm, " ");
							StringTokenizer stTipo = new StringTokenizer(
									stringTipo, " ");
							int j = stRutas.countTokens();
							final String datosAux[] = new String[j];
							int i = 0, total = 0;
							boolean yaEsta = false;
							// Tratamos el string de nombre de rutas que hemos
							// obtenido
							// de
							// la
							// base
							// de datos, los separamos por espacio y los
							// insertamos
							// en
							// el
							// array
							// datos, teniendo en cuenta que no repitamos
							// ninguno
							while (stRutas.hasMoreTokens()) {
								yaEsta = false;
								String km = stKm.nextToken();
								Float kmFloat = Float.parseFloat(km);
								int kmInt = kmFloat.intValue();
								String token = stRutas.nextToken() + "     "
										+ kmInt + " Km" + "     -     "
										+ stTipo.nextToken();
								for (int l = 0; l < datosAux.length; l++) {
									if (datosAux[l] == null)
										break;
									else {
										if (datosAux[l].equals(token)) {
											yaEsta = true;
											break;
										}
									}
								}
								if (!yaEsta) {
									datosAux[i] = token;
									total++;
									i++;
								}
							}
							datos = new String[total];
							for (int l = 0; l < total; l++) {
								datos[l] = datosAux[l];
							}
							ArrayAdapter<String> adaptador = new ArrayAdapter<String>(
									getApplicationContext(),
									android.R.layout.simple_list_item_1, datos);

							listaRutas.setAdapter(adaptador);

							listaRutas
									.setOnItemClickListener(new OnItemClickListener() {

										public void onItemClick(
												AdapterView<?> arg0, View arg1,
												int arg2, long arg3) {

											String[] seleccion = datos[arg2]
													.split("\\s+");
											nombreSeleccionado = seleccion[0];
											StringTokenizer stRutas = new StringTokenizer(
													nombreSeleccionado, " ");
											nombreSeleccionado = stRutas
													.nextToken();
											Log.v("RUTA SELECCIONADA",
													nombreSeleccionado);
											dialog.show();
											AsyncTask<Void, Void, Void> tarea2 = new ClaseComunicacion2();
											tarea2.execute();

										}

									});
						} else {
							Toast toast = Toast.makeText(
									getApplicationContext(),
									"No se ha podido cargar la lista de rutas -1",
									Toast.LENGTH_SHORT);
							toast.show();
						}
					} else {
						Toast toast = Toast.makeText(getApplicationContext(),
								"No se ha podido cargar la lista de rutas null",
								Toast.LENGTH_SHORT);
						toast.show();
					}
				} catch (NumberFormatException e) {
					e.printStackTrace();
					Toast toast = Toast.makeText(getApplicationContext(),
							"No se ha podido cargar la lista de rutas",
							Toast.LENGTH_SHORT);
					toast.show();
				} catch (JSONException e) {
					e.printStackTrace();
					Toast toast = Toast.makeText(getApplicationContext(),
							"No se ha podido cargar la lista de rutas",
							Toast.LENGTH_SHORT);
					toast.show();
				}

			} else {
				Toast toast = Toast.makeText(getApplicationContext(),
						"No se ha podido cargar la lista de rutas",
						Toast.LENGTH_SHORT);
				toast.show();
			}
		}
	}

	public void rellenarResultado() {

	}

	private class ClaseComunicacion2 extends AsyncTask<Void, Void, Void> {
		FuncionesJSON funcion = new FuncionesJSON();
		JSONObject json = new JSONObject();

		@Override
		protected Void doInBackground(Void... params) {
			try {

				json = funcion.buscarRuta(nombreSeleccionado);

			} catch (Exception e) {
				e.printStackTrace();
				correcto = false;

			}

			return null;
		}

		@Override
		protected void onPostExecute(Void resutl) {
			dialog.dismiss();
			if (correcto) {
				try {
					if (json.getString(KEY_SUCCESS) != null) {
						String res = json.getString(KEY_SUCCESS);
						if (Integer.parseInt(res) == 1) {
							idJson = Integer.parseInt((String) json
									.getJSONObject("ruta").get("id"));
							distanciaJson = Float.parseFloat((String) json
									.getJSONObject("ruta").get("distancia"));
							nombreJson = (String) json.getJSONObject("ruta")
									.get("nombre");
							tipoJson = (String) json.getJSONObject("ruta").get(
									"tipo");
							ficheroJson = (String) json.getJSONObject("ruta")
									.get("fichero");
						} else {
							Toast toast = Toast.makeText(
									getApplicationContext(),
									"No se ha podido cargar la ruta",
									Toast.LENGTH_SHORT);
							toast.show();
						}
					} else {
						Toast toast = Toast.makeText(getApplicationContext(),
								"No se ha podido cargar la ruta",
								Toast.LENGTH_SHORT);
						toast.show();
					}
				} catch (NumberFormatException e) {
					e.printStackTrace();
					Toast toast = Toast.makeText(getApplicationContext(),
							"No se ha podido cargar la ruta",
							Toast.LENGTH_SHORT);
					toast.show();
				} catch (JSONException e) {
					e.printStackTrace();
					Toast toast = Toast.makeText(getApplicationContext(),
							"No se ha podido cargar la ruta",
							Toast.LENGTH_SHORT);
					toast.show();
				}
				tratarSeleccion();
			} else {
				Toast toast = Toast.makeText(getApplicationContext(),
						"No se ha podido cargar la ruta", Toast.LENGTH_SHORT);
				toast.show();
			}
		}
	}

	public void onPause() {

		finish();
		super.onPause();
	}

	public void tratarSeleccion() {
		try {
			new CreacionRutaGPX(ficheroJson, nombreJson);
		} catch (IOException e) {
			e.printStackTrace();
			correcto = false;
		}
		if (correcto) {
			// Datos del fichero ruta

			ParseoArchivoRuta rutaParseo = new ParseoArchivoRuta(
					getApplicationContext(), nombreJson);

			Toast toast = Toast.makeText(getApplicationContext(), "Ruta "
					+ nombreJson + " cargada con exito", Toast.LENGTH_SHORT);
			toast.show();

			Intent intent = new Intent(getApplicationContext(),
					MainActivity.class);

			Bundle bundle = new Bundle();
			bundle.putString("ACTIVITY", "CargarActivity");
			bundle.putDouble("VELOCIDADMEDIA", 0.0);
			bundle.putDouble("VELOCIDADMAXIMA", 0.0);
			bundle.putDouble("DISTANCIA", distanciaJson);
			bundle.putDouble("DURACION", 0.0);
			bundle.putDouble("CALORIAS", 0.0);
			if (tipoJson.equals("Pie"))
				bundle.putInt("TIPO", 0);
			else
				bundle.putInt("TIPO", 1);
			bundle.putParcelable("RUTA", rutaParseo.getRuta());
			bundle.putString("NOMBRERUTACARGADA", nombreJson);

			intent.putExtras(bundle);
			finish();
			intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
			startActivity(intent);
		} else {
			Toast toast = Toast.makeText(getApplicationContext(),
					"No se ha podido cargar la ruta", Toast.LENGTH_LONG);
			toast.show();
		}

	}

	protected Document parsearFichero(File f) {

		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

		DocumentBuilder builder;
		try {
			builder = factory.newDocumentBuilder();
			try {
				Document dom = builder.parse(f);
				return dom;
			} catch (SAXException e) {
				e.printStackTrace();
				Log.e("Parser",
						"Error SAX en parser" + e.getCause() + " "
								+ e.getMessage());
			} catch (IOException e) {
				e.printStackTrace();
				Log.e("Parser", "Error IO en parser");
			}
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
			Log.e("Builder", "Error creando el documentBuilder");
		}

		return null;
	}

	protected File abrirFichero(String seleccion) {

		try {
			File ruta_sd = Environment.getExternalStorageDirectory();

			File f = new File(ruta_sd.getAbsolutePath(), seleccion + ".gpx");
			return f;
		} catch (Exception ex) {
			Log.e("Ficheros", "Error al leer fichero desde tarjeta SD");
		}
		return null;

	}

	public void onBackPressed() {

		finish();
		Intent intent = new Intent(getApplicationContext(), MainActivity.class);
		Bundle bundle = new Bundle();
		bundle.putString("ACTIVITY", "cargarCancelado");
		intent.putExtras(bundle);
		intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
		startActivity(intent);
	}

}
